# 状态机基类，继承自Node
class_name NodeStateMachine
extends Node

# 导出变量：初始状态节点
@export var initial_node_state: NodeState

# 状态字典：存储所有子状态节点
var node_states: Dictionary = {}
# 当前状态节点
var current_node_state: NodeState
# 当前状态名称（小写）
var current_node_state_name: String
# 父节点名称
var parent_node_name: String


# 节点准备就绪时调用
func _ready() -> void:
	# 获取父节点名称
	parent_node_name = get_parent().name

	# 遍历所有子节点
	for child in get_children():
		# 如果子节点是状态节点
		if child is NodeState:
			# 将状态节点添加到字典中（key为小写名称）
			node_states[child.name.to_lower()] = child
			# 连接状态切换信号
			child.transition.connect(transition_to)

	# 如果有初始状态
	if initial_node_state:
		# 调用初始状态的进入方法
		initial_node_state._on_enter()
		# 设置当前状态
		current_node_state = initial_node_state
		# 设置当前状态名称
		current_node_state_name = current_node_state.name.to_lower()


# 每帧处理逻辑
func _process(delta: float) -> void:
	# 如果当前有状态，调用状态的_process方法
	if current_node_state:
		current_node_state._on_process(delta)


# 物理帧处理逻辑
func _physics_process(delta: float) -> void:
	# 如果当前有状态
	if current_node_state:
		# 调用状态的物理帧处理方法
		current_node_state._on_physics_process(delta)
		# 检查状态转换条件
		current_node_state._on_next_transitions()
		# 调试打印当前状态（已注释）
		#print(parent_node_name, " Current State: ", current_node_state_name)




# 状态转换方法
func transition_to(node_state_name: String) -> void:
	# 如果要切换的状态与当前状态相同，直接返回
	if node_state_name == current_node_state.name.to_lower():
		return

	# 从字典中获取新状态节点
	var new_node_state = node_states.get(node_state_name.to_lower())

	# 如果新状态不存在，直接返回
	if !new_node_state:
		return

	# 如果当前有状态，调用退出方法
	if current_node_state:
		current_node_state._on_exit()

	# 调用新状态的进入方法
	new_node_state._on_enter()

	# 更新当前状态和状态名称
	current_node_state = new_node_state
	current_node_state_name = current_node_state.name.to_lower()
	# 调试打印当前状态（已注释）
	#print("Current State: ", current_node_state_name)
